// 云函数入口文件
const cloud = require("wx-server-sdk");

// 初始化云开发环境
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV // 使用当前云环境
});

const db = cloud.database();
const _ = db.command;

// 确保集合存在
async function ensureCollectionExists(collectionName) {
  try {
    await db.collection(collectionName).count();
    return true;
  } catch (error) {
    if (error.errCode === -502005) {
      try {
        await db.createCollection(collectionName);
        return true;
      } catch (createError) {
        console.error(`创建集合 ${collectionName} 失败：`, createError);
        return false;
      }
    }
    throw error;
  }
}

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext();
  const { code, userInfo } = event;

  try {
    // 确保users集合存在
    await ensureCollectionExists('users');

    // 查询是否已存在该用户
    const userResult = await db.collection('users').where({
      openid: wxContext.OPENID
    }).get();

    let userId;

    if (userResult.data.length === 0) {
      // 新用户，创建用户记录
      const result = await db.collection('users').add({
        data: {
          openid: wxContext.OPENID,
          unionid: wxContext.UNIONID,
          ...userInfo,
          createTime: db.serverDate(),
          updateTime: db.serverDate(),
          lastLoginTime: db.serverDate()
        }
      });
      userId = result._id;
    } else {
      // 已存在的用户，更新信息
      const user = userResult.data[0];
      userId = user._id;
      await db.collection('users').doc(userId).update({
        data: {
          ...userInfo,
          updateTime: db.serverDate(),
          lastLoginTime: db.serverDate()
        }
      });
    }

    // 生成token
    const token = `${userId}_${Date.now()}_${wxContext.OPENID}`;

    // 更新用户token
    await db.collection('users').doc(userId).update({
      data: {
        token: token
      }
    });

    return {
      code: 0,
      message: '登录成功',
      data: {
        token: token,
        userId: userId
      }
    };

  } catch (err) {
    console.error('[微信登录失败]', err);
    return {
      code: -1,
      message: '登录失败，请重试'
    };
  }
};
